//package com.kira.scaffoldmvc.HeartBeat;
//
//import lombok.experimental.UtilityClass;
//import lombok.extern.slf4j.Slf4j;
//
//import java.util.Map;
//import java.util.concurrent.ConcurrentHashMap;
//import java.util.concurrent.ScheduledThreadPoolExecutor;
//import java.util.concurrent.TimeUnit;
//
///**
// * 服务健康管理器
// * <p>
// * 该类通常与类{@link SwitchBarrier}一起使用，心跳管理器管理业务的运行状态，而类{@link SwitchBarrier}管理对远端业务的访问
// * </p>
// *
// * @author shizi
// * @since 2020-11-24 15:16:35
// */
//@Slf4j
//@UtilityClass
//public class ServerHealthManager {
//
//    /**
//     * 心跳守护线程池
//     */
//    private final ScheduledThreadPoolExecutor scheduler = new ScheduledThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), r -> {
//        Thread thread = new Thread(r, "health-daemon");
//        thread.setDaemon(true);
//        return thread;
//    });
//    /**
//     * 心跳异常时候的阈值打印
//     */
//    private final Integer HEARD_BEAN_PRINT_THRESHOLD = 6;
//    /**
//     * 打印日志频率阈值
//     */
//    private Integer printLogThresholdNum = 0;
//    /**
//     * 业务的心跳任务
//     */
//    private final Map<String, MultiPair<String, Integer, Boolean>> healthTaskMap = new ConcurrentHashMap<>();
//
//    static {
//        scheduler.scheduleWithFixedDelay(ServerHealthManager::checkHealth, 5, 5, TimeUnit.SECONDS);
//    }
//
//    private static void checkHealth() {
//        healthTaskMap.forEach((k, v) -> {
//            Boolean health = NetUtil.hostPortIsHealth(v.getLeft(), v.getMiddle());
//            if (health) {
//                serverSetAvailable(k, v.getRight());
//                v.setRight(true);
//            } else {
//                serverSetUnAvailable(k);
//                v.setRight(false);
//            }
//        });
//    }
//
//    /**
//     * 添加业务的域名和端口判断
//     *
//     * @param bizName 业务名
//     * @param host    业务的心跳检测host
//     * @param port    业务端口
//     */
//    public void addHealthWatch(String bizName, String host, Integer port) {
//        healthTaskMap.putIfAbsent(bizName, new MultiPair<>(host, port, true));
//    }
//
//    /**
//     * 手动运行
//     *
//     * @param bizName 业务名
//     */
//    public void handleRun(String bizName) {
//        if (!healthTaskMap.containsKey(bizName)) {
//            return;
//        }
//        MultiPair<String, Integer, Boolean> healthPair = healthTaskMap.get(bizName);
//        Boolean health = NetUtil.hostPortIsHealth(healthPair.getLeft(), healthPair.getMiddle());
//        if (health) {
//            serverSetAvailable(bizName, healthPair.getRight());
//            healthPair.setRight(true);
//        } else {
//            serverSetUnAvailable(bizName);
//            healthPair.setRight(false);
//        }
//    }
//
//    /**
//     * 业务是否可用
//     *
//     * @param bizName 业务名
//     * @return true：业务可用，false：业务不可用
//     */
//    public boolean isHealth(String bizName) {
//        return SwitchBarrier.canCross(bizName);
//    }
//
//    private void serverSetAvailable(String bizName, Boolean serverBeforeAvailable) {
//        if (!serverBeforeAvailable) {
//            log.debug("服务【{}】网络通了", bizName);
//        }
//        printLogThresholdNum = 0;
//        SwitchBarrier.allowCross(bizName);
//    }
//
//    private void serverSetUnAvailable(String bizName) {
//        if (printLogThresholdNum <= 0) {
//            log.debug("服务【{}】网络异常，host:{}, port:{}", bizName, healthTaskMap.get(bizName).getLeft(), healthTaskMap.get(bizName).getMiddle());
//            printLogThresholdNum = HEARD_BEAN_PRINT_THRESHOLD;
//        } else {
//            printLogThresholdNum--;
//        }
//        SwitchBarrier.forbidCross(bizName);
//    }
//}
